home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / netzwerk / parnet-filesystem / netio1.c < prev    next >
C/C++ Source or Header  |  1996-02-26  |  3KB  |  141 lines

  1. /*
  2.  * $Id: netio1.c,v 1.3 1995/11/14 00:43:34 Rhialto Exp $
  3.  * $Log: netio1.c,v $
  4.  * Revision 1.3  1995/11/14  00:43:34  Rhialto
  5.  * More casts for yet stricter DICE type checking...
  6.  *
  7.  * Revision 1.2  1995/11/14  00:08:15  Rhialto
  8.  * #ifdef -> #if.
  9.  *
  10.  * Revision 1.1  1993/12/02  20:45:46  Rhialto
  11.  * Initial revision
  12.  *
  13.  *
  14.  * Network file system: network I/O for the client only.
  15.  * This version for PARNET.DEVICE.
  16.  */
  17.  
  18. #include "netfs.h"
  19. #include "devices/parnet.h"
  20.  
  21. #include <string.h>
  22.  
  23. #if DEBUG
  24. #   include "syslog.h"
  25. #else
  26. #   define    debug(x)
  27. #endif
  28.  
  29. Prototype LONG SendRecv(void *sdata, ULONG slen, void *rdata, ULONG rlen);
  30.  
  31. LONG
  32. SendRecv(Packet *sdata, ULONG slen, Packet *rdata, ULONG rlen)
  33. {
  34.     return SendRecv2(sdata, slen, NULL, 0, rdata, rlen, NULL, 0);
  35. }
  36.  
  37. Prototype LONG Send2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2);
  38.  
  39. LONG
  40. Send2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2)
  41. {
  42.     sdata1->p_Type = pt_Request;
  43.     sdata1->p_Origin = MyAddr;
  44.  
  45.     ParReq->io_Command = CMD_WRITE;
  46.     ParReq->io_Data    = sdata1;
  47.     ParReq->io_Length  = slen1;
  48.     ParReq->io_Data2   = sdata2;
  49.     ParReq->io_Length2 = slen2;
  50.  
  51.     return DoIO((struct IORequest *)ParReq);
  52. }
  53.  
  54. Prototype LONG SendRecv2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2, Packet *rdata1, ULONG rlen1, void *rdata2, ULONG rlen2);
  55.  
  56. LONG
  57. SendRecv2(Packet *sdata1, ULONG slen1, void *sdata2, ULONG slen2,
  58.       Packet *rdata1, ULONG rlen1, void *rdata2, ULONG rlen2)
  59. {
  60.     Packet       *pkt;
  61.     LONG        ioerror = 0;
  62.     struct IOParReq *io;
  63.  
  64.     debug(("Send %d %d, expect %d %d\n", slen1, slen2, rlen1, rlen2));
  65.     if (ioerror = Send2(sdata1, slen1, sdata2, slen2)) {
  66.     error = ERROR_NO_DISK;
  67.     return ioerror;
  68.     }
  69.  
  70. reread:
  71.     WaitPort(RdPort);             /* XXX timeout & retry here */
  72.     io = (struct IOParReq *)GetMsg(RdPort);
  73.     pkt = io->io_Data;
  74.  
  75.     debug(("Receive %d\n", io->io_Actual));
  76.     if (io->io_Error && (io->io_Error != PPERR_WARN_OVFLOW)) {
  77.     debug(("parnet error = %d\n", io->io_Error));
  78.     ioerror = io->io_Error;
  79.     error = ERROR_NO_DISK;
  80.     goto end;
  81.     }
  82.  
  83.     switch (DoProtocol(io, pkt)) {
  84.     case pt_Reply:
  85.     /* This is what we want */
  86.     memcpy(rdata1, pkt, rlen1);
  87.     if (rlen2 && (slen2 = io->io_Actual - rlen1) > 0) {
  88.         memcpy(rdata2, (char *)pkt + rlen1, slen2);
  89.     }
  90.     break;
  91.     case pt_Reset:
  92.     ioerror = pt_Reset;    /* No use in retrying */
  93.     break;
  94.     default:
  95.     /* Ignore bad packets, including mistaken pt_Requests */
  96.     SendRead(io, pkt, PKTSIZE);
  97.     debug(("Re-read a packet\n"));
  98.     goto reread;
  99.     }
  100.  
  101. end:
  102.     SendRead(io, pkt, PKTSIZE);
  103.  
  104.     return ioerror;
  105. }
  106.  
  107. Prototype void ClientDefaults(ULONG type, ULONG addrs);
  108.  
  109. void
  110. ClientDefaults(ULONG type, ULONG addrs)
  111. {
  112.     debug(("ClientDefaults %x %x\n", type, addrs));
  113.  
  114.     switch (type) {
  115.     case 0:
  116.     /* Primary client/server */
  117.     MyAddr = CLI_ADDR;
  118.     PeerAddr = SRV_ADDR;
  119.     NetFSPort = NETFS_PORT;
  120.     break;
  121.     case 1:
  122.     /* Secondary server/client */
  123.     MyAddr = SRV_ADDR;
  124.     PeerAddr = CLI_ADDR;
  125.     NetFSPort = NETFS_PORT + 1;
  126.     break;
  127.     case 2:
  128.     /* Custom installation */
  129. /*
  130.  * Interleave = 0xppppsscc, where
  131.  * pppp: the port number the server is using (in hex)
  132.  * ss  : the parnet address of the server (in hex, 0x01 .. 0xFE)
  133.  * cc  : the parnet address of this client (in hex, 0x01 .. 0xFE)
  134.  */
  135.     MyAddr =     addrs      & 0x00FF;
  136.     PeerAddr =  (addrs >>  8) & 0x00FF;
  137.     NetFSPort = (addrs >> 16) & 0xFFFF;
  138.     break;
  139.     }
  140. }
  141.